/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Nico
 */
public class Producto {

    public static ResultSet rs;
    public static ResultSet rs1;
    public static ResultSet rsNuevoProducto;
    public static ResultSet rsColorProducto;
    public static ResultSet rsTalleProducto;
    public static ResultSet rsActualizaCantidad;
    private static PreparedStatement stmt;
    private static PreparedStatement stmtProducto;
    private static PreparedStatement stmtRemanente;
    private static PreparedStatement stmtTalle;
    private static PreparedStatement stmtColor;
    private static PreparedStatement stmtActualizaProd;
    private static PreparedStatement stmtBuscaUltimoCantidad;
    private static PreparedStatement stmtBuscaUltimoRemanente;
    private static int id;
    private static int idTalle;
    private static int idColor;
    
   
    public static ResultSet filtrarProducto(Statement st) {
        try {
            rs = st.executeQuery("SELECT codigo_barra,nombre,precio,cantidad "
                    + "FROM producto ");
                  
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rs;
    }
 
    public static ResultSet filtrarProductoPorCodigoYStock(Statement st, String codigo, int minStock, int maxStock) {
        try {

            rs1 = st.executeQuery("SELECT id,codigo_barra,nombre, precio,cantidad "
                    + "FROM producto "
                    + "WHERE codigo_barra='" + codigo
                    + "' AND cantidad >=" + minStock + " AND cantidad <=" + maxStock);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("rs1" + rs1);
        return rs1;
    }
  
    public static ResultSet filtrarProductoPorCodigo(Statement st, String codigo) {
        try {
            rs1 = st.executeQuery("SELECT id,codigo_barra,nombre,precio,cantidad "
                    + "FROM producto "
                    + "WHERE codigo_barra='" + codigo
                    + "'");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rs1;
    }


    public static ResultSet updateCantidad(Statement st, int codigo, int color, int talle, int cantidad) {
        try {
            Connection conexion = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/ficcion", "root", "4932273");
            stmt = conexion.prepareStatement("UPDATE cantidad set cantidad ='" + cantidad + "' WHERE producto_id ='"
                    + codigo + "' AND color_id = '" + color + "' AND talle_id = '" + talle + "'");
            stmt.executeUpdate();
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rs1;
    }

    /*
     * Este metodo ingresa un producto nuevo que no existe en la BD
     */
    public static ResultSet insertaNuevoProducto(String codigoBarra,
                                     String descripcion,
                                     String color,
                                     String talle,
                                     String precio,
                                     String cantidad,
                                     boolean remanente,
                                     String cantidadRemanente,
                                     Statement st){
        try{
            Connection conexion = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/ficcion", "root", "4932273");
            //Ejecuta los queries para guardar el producto en la BD
            stmtProducto = conexion.prepareStatement("INSERT into producto(CODIGO_BARRA, nombre, precio) VALUES ('"+ codigoBarra +"','"
                                                     + descripcion +"','"+ precio +"')");
            stmtProducto.executeUpdate();
            stmtProducto.close();
        
            if(remanente){
                stmtRemanente = conexion.prepareStatement("INSERT into remanente(cantidad, producto_id) VALUES ('"+ cantidadRemanente +"','"+ codigoBarra +"')");
                stmtRemanente.executeUpdate();
                stmtRemanente.close();
            }
            String queryTalle = "SELECT ID from talle WHERE talle = ?";
            String queryColor = "SELECT ID from color WHERE color = ?";
            
            //Obtiene el valor de ID del talle seleccionado
            stmtTalle = conexion.prepareStatement(queryTalle);
            stmtTalle.setString(1, talle);
            rsTalleProducto = stmtTalle.executeQuery();
            while(rsTalleProducto.next()){
                idTalle = rsTalleProducto.getInt("ID");
            }
            stmtTalle.close();
            
            //Obtiene el valor de ID del color seleccionado
            stmtColor = conexion.prepareStatement(queryColor);
            stmtColor.setString(1, color);
            rsColorProducto = stmtColor.executeQuery();
            while(rsColorProducto.next()){
                idColor = rsColorProducto.getInt("ID");
            }
            stmtColor.close();
            
            //Guarda los valores en la tabla cantidad
            Statement st2 = (Statement) Controller.Conexion.conectar();
                st2.executeUpdate("INSERT INTO cantidad (id, cantidad, color_id, producto_id, talle_id) VALUES (" + id + ",'" + cantidad + "'," + idColor + "," + codigoBarra + ","+ idTalle +")");
                st2.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return rs1;
    }
    
    /*
     * Este metodo ingresa una variante de un producto que ya existe
     */
    public static ResultSet insertaVarianteProducto(String codigoBarra,
                                     String descripcion,
                                     String color,
                                     String talle,
                                     String precio,
                                     String cantidad,
                                     boolean remanente,
                                     String cantidadRemanente,
                                     Statement st){
        try{
            Connection conexion = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/ficcion", "root", "4932273");
            //Ejecuta los queries para guardar el producto en la BD
            
            if(remanente){
                stmtRemanente = conexion.prepareStatement("INSERT into remanente(cantidad, producto_id) VALUES ('"+ cantidadRemanente +"','"+ codigoBarra +"')");
                stmtRemanente.executeUpdate();
            }
            String queryTalle = "SELECT ID from talle WHERE talle = ?";
            String queryColor = "SELECT ID from color WHERE color = ?";
            
            //Obtiene el valor de ID del talle seleccionado
            stmtTalle = conexion.prepareStatement(queryTalle);
            stmtTalle.setString(1, talle);
            rsTalleProducto = stmtTalle.executeQuery();
            while(rsTalleProducto.next()){
                idTalle = rsTalleProducto.getInt("ID");
                System.out.println(idTalle);
            }
            
            //Obtiene el valor de ID del color seleccionado
            stmtColor = conexion.prepareStatement(queryColor);
            stmtColor.setString(1, color);
            rsColorProducto = stmtColor.executeQuery();
            while(rsColorProducto.next()){
                idColor = rsColorProducto.getInt("ID");
            }
            stmtColor.close();
            stmtTalle.close();
            
            //Guarda los valores en la tabla cantidad
            Statement st2 = (Statement) Controller.Conexion.conectar();
                st2.executeUpdate("INSERT INTO cantidad (id, cantidad, color_id, producto_id, talle_id) VALUES (" + id + ",'" + cantidad + "'," + idColor + "," + codigoBarra + ","+ idTalle +")");
                st2.close();
            }
        catch(Exception e){
            e.printStackTrace();
        }
        return rs1;
    }

    /*
     * Se actualiza el artículo que corresponde al codigo que se pasa como
     * parametro
     */
    public static void actualizaArticulo(Statement st, String codigo, String nombre, String precio) {
        try{
            //Si updateBaseProd es true modificara los datos del producto de la tabla producto solamente
                Connection conexion = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/ficcion", "root", "4932273");
                stmtActualizaProd = conexion.prepareStatement("UPDATE producto SET nombre = ?, precio = ? WHERE CODIGO_BARRA = ?");
                stmtActualizaProd.setString(1, nombre);
                stmtActualizaProd.setString(2, precio);
                stmtActualizaProd.setString(3, codigo);

                stmtActualizaProd.executeUpdate();
                stmtActualizaProd.close();
        }
        catch(Exception e){
            e.printStackTrace();
        } 
    }
    
    /*
     * Este metodo elimina el articulo o advierte si este no existe en la BD
     */
    public static void eliminaArticulo(String codigo) {
        try {
            String idEnProducto = "DELETE from producto WHERE CODIGO_BARRA= '" + codigo + "'";
            String idEnRemanente = "DELETE from remanente WHERE producto_id = '" + codigo + "'";
            String idEnCantidad = "DELETE from cantidad WHERE producto_id = '" + codigo + "'";
            int delete;
            
            Connection conexion = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/ficcion", "root", "4932273");
            Statement stElimina = (Statement) conexion.createStatement();
            
            //Intenta eliminar el codigo del producto en otras tablas si es que existe
            try{
                stElimina.executeUpdate(idEnRemanente);
                stElimina.executeUpdate(idEnCantidad);
            }catch(Exception e){
               e.printStackTrace();
            }
            //Elimina el codigo del producto de la tabla Producto
            delete = stElimina.executeUpdate(idEnProducto);

            if (delete == 1) {
                JOptionPane.showMessageDialog(null, "Artículo eliminado");
            } else {
                JOptionPane.showMessageDialog(null, "El articulo no se pudo eliminar, reintente");
            }
            stElimina.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /*
     * Valida si existe o no el articulo en la BD
     */
    public static boolean existeArticulo(Statement st, String codigoBarras){
        
        boolean existe = false;
        try{
            rs1 = st.executeQuery("SELECT * from producto WHERE CODIGO_BARRA= ' " + codigoBarras  + " '");
            if(rs1.next()){
                existe = true;
            }
            else{
                existe = false;
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return existe;
    }
}
